/*
 * tpg1.c
 *
 *  Created on: Sep 22, 2013
 *      Author: enano
 */

#include <stdio.h>
#include "TDA_TAV.h"
#include <string.h>
/* #include "ArgParser.h" */

#define OK 0
#define ERROR -1
#define EQUAL 0

typedef enum _metodo { abrir, cerrar, liberar, actualizar, rollback, getInfoOne, getInfoAll} metodo;

void imprimir_tipo_info(const info_revision_t info);

void imprimirListaInfo(TListaSimple *listaInfo );

int liberarInfo( info_revision_t* info );


int main ( int argc, char **argv )
{
    /* TODO Formato de programa MUY bizarro.. Para darse una idea general. */

    TAV tav;
    int rev, resultado;
    TListaSimple listaInfo;
    info_revision_t info;

    char coment[30] = {'\0'};

    if ( strcmp(argv[1], ADD) == EQUAL )
    {
        resultado = TAV_Abrir(&tav, argv[2], TAV_CREAR);
        TAV_Cerrar(&tav);

        TAV_Abrir(&tav, argv[2], TAV_USAR);
        strncpy(coment, "Commit Inicial", 30);
        TAV_Actualizar(&tav, coment);
        TAV_Cerrar(&tav);
    }


    if ( strcmp(argv[1], REMOVE) == EQUAL )
    {
        resultado = TAV_Abrir(&tav, argv[2], TAV_USAR);
        TAV_Liberar(&tav);
    }

    if ( strcmp(argv[1], QUERY) == EQUAL )
    {
        resultado = TAV_Abrir(&tav, argv[2], TAV_USAR);

        if ( argc == 4 )
        {
            rev = atoi( argv[3] );
            resultado = TAV_GetInfoRevision(&tav, rev, &info);
            if ( resultado == OK )
            {
                imprimir_tipo_info(info);
                liberarInfo(&info);
            }

        }
        else
        {
            L_Crear( &listaInfo, sizeof(info_revision_t) );
            resultado = TAV_GetListaRevisiones(&tav, &listaInfo);
            if ( resultado == OK )
                imprimirListaInfo(&listaInfo);
        }
        TAV_Cerrar(&tav);

    }

    if ( strcmp(argv[1], COMMIT) == EQUAL )
    {
        resultado = TAV_Abrir(&tav, argv[2], TAV_USAR);
        TAV_Actualizar(&tav, argv[3]);
        TAV_Cerrar(&tav);
    }

    if ( strcmp(argv[1], ROLLBACK) == EQUAL )
    {
        resultado = TAV_Abrir(&tav, argv[2], TAV_USAR);
        rev = atoi(argv[3]);
        strncpy(coment, "restauracion de la version ", 30);
        strncat(coment, argv[3], 30);
        strncat(coment, ".", 30);
        TAV_Deshacer(&tav, rev, coment);
        TAV_Cerrar(&tav);
    }

return OK;
}

void imprimir_tipo_info(const info_revision_t info)
{
    printf("Revision: %d\n", info.num);
    printf("Fecha: %s", info.fecha);
    printf("Comentario: %s\n", info.comentario);
}


void imprimirListaInfo(TListaSimple *listaInfo )
{   info_revision_t dato;

    L_Mover_Cte(listaInfo, L_Primero);

    do
    {
        L_Elem_Cte(*listaInfo, &dato);
        imprimir_tipo_info(dato);
        liberarInfo(&dato);

    }while ( L_Mover_Cte( listaInfo, L_Siguiente) == TRUE );
}

int liberarInfo( info_revision_t* info )
{
    free(info->comentario);
    free(info->fecha);
    return OK;
}

int errores( int resultado, metodo funcion )
{

    return OK;
}
